home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / txl / rexxmdl2.lha / RexModula2 / Fork.rmi < prev    next >
Text File  |  1992-02-26  |  1KB  |  60 lines

  1. (* Fork monitor *)
  2. MODULE Fork;
  3.  
  4. FROM XdrM2_Fork IMPORT tAck,tFork;
  5. IMPORT InOut;
  6.  
  7. CONST 
  8.     None = 0;
  9.     Left = 1;
  10.     Right = 2;
  11.     pickup = 1;
  12.     putdown = 2;
  13.  
  14.  
  15. VAR
  16.     allocated: INTEGER;
  17.     req: tFork;
  18.     ack: tAck;
  19.  
  20.  
  21. PROCEDURE display(allocated: INTEGER;req: tFork);
  22.  
  23. BEGIN
  24.     InOut.WriteString("Fork ");
  25.     CASE allocated OF
  26.     None: 
  27.         InOut.WriteString(" not allocated");
  28.       | Left, Right: 
  29.       InOut.WriteString(" allocated to philosopher ");
  30.       InOut.WriteString(req.Name);
  31.     END;
  32.     InOut.WriteLn();
  33. END display;
  34.  
  35.  
  36. BEGIN
  37.     allocated := None;
  38.     LOOP
  39.         display(allocated,req); 
  40.         SELECT
  41.             (allocated = None) OR (allocated = Left) && ACCEPT(left,req) :
  42.             CASE req.order OF
  43.                 pickup:
  44.                     allocated := Left;
  45.               | putdown:
  46.                     allocated := None;
  47.         END;
  48.         REPLY(left,ack);
  49.           | (allocated = None) OR (allocated = Right) && ACCEPT(right,req) :
  50.             CASE req.order OF
  51.                 pickup:
  52.                      allocated := Right;
  53.               | putdown:
  54.                      allocated := None;
  55.         END;
  56.         REPLY(left,ack);
  57.         END;
  58.     END;
  59. END Fork.
  60.